package thinking

object AddTraits {
  def main(args: Array[String]) {
    val mysql = new Mysql4 with DB4 with File4
    println("===========")
    mysql.insert(10)

    /**
     * 说明：
     * 1。 创建Mysql4实例时，动态混入DB4 和 File4
     * 底层方法的执行顺序：
     * 输出：
     * 1。 Operate4
     * 2。 Data4
     * 3。 DB4
     * 4。 FILE4
     * 总结： 在叠加特质时，会从后面开始执行（从左到右加载）
     *
     * //当执行一个混入的方法时，执行的顺序是怎样的？
     * 结论：顺序时从右向左的
     *
     * 此时的supper时，指的并不是他的父类了，而是它左边的特质！！重点！
     * 如果左边没有特质符合规则，才会去自己父类去找方法
     *
     */

  }
}

trait Operate4 {
  println("Operate4")

  def insert(id: Int)
}

trait Data4 extends Operate4 {
  println("Data4")

  override def insert(id: Int): Unit = {
    println("插入数据 = " + id)
  }
}

trait DB4 extends Data4 {
  println("DB4")

  override def insert(id: Int): Unit = {
    println("向数据库")
    super.insert(id)
  }
}

trait File4 extends Data4 {
  println("File4")

  override def insert(id: Int): Unit = {
    println("向文件")
    super.insert(id)
  }
}

class Mysql4 {}
